/*
 * Copyright (C) 2019 Square, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * OkHttp 异常类型定义
 *
 * 异常继承层次结构：
 *
 * Error (JavaScript 内置)
 * ├── IOException                         # I/O 操作异常基类
 * │   ├── SocketException                 # Socket 操作异常
 * │   │   └── SocketTimeoutException      # Socket 超时异常
 * │   ├── UnknownHostException            # DNS 解析失败异常
 * │   ├── ProtocolException               # HTTP 协议异常
 * │   ├── InterruptedIOException          # I/O 操作被中断异常
 * │   ├── SSLException                    # SSL/TLS 异常基类
 * │   │   ├── SSLHandshakeException       # SSL 握手失败异常
 * │   │   └── SSLPeerUnverifiedException  # SSL 对端验证失败异常
 * │   ├── CertificateException            # 证书异常基类
 * │   │   ├── CertificateExpiredException     # 证书过期异常
 * │   │   ├── CertificateNotYetValidException # 证书尚未生效异常
 * │   │   ├── CertificateRevokedException     # 证书被吊销异常
 * │   │   └── CertificatePathException        # 证书链验证异常
 * │   ├── ProxyConnectException           # 代理连接异常
 * │   ├── SNIException                    # SNI 异常
 * │   ├── ConnectionShutdownException     # 连接关闭异常
 * │   ├── FileNotFoundException           # 文件未找到异常
 * │   └── UnknownServiceException         # 未知服务异常
 * ├── RouteException                      # 路由异常（包装 IOException）
 * ├── StreamResetException                # HTTP/2 流重置异常
 * ├── RuntimeException                    # 运行时异常基类
 * │   ├── IllegalStateException           # 非法状态异常
 * │   ├── IllegalArgumentException        # 非法参数异常
 * │   ├── IndexOutOfBoundsException       # 索引越界异常
 * │   │   └── ArrayIndexOutOfBoundsException  # 数组索引越界异常
 * │   └── NoSuchElementException          # 元素不存在异常
 * └── AssertionError                      # 断言错误
 */

import { ErrorCode } from '../http2/ErrorCode'
import { List } from '@kit.ArkTS'
import { BusinessError } from '@kit.BasicServicesKit'

// ============================================================================
// 第一部分：I/O 异常基类
// ============================================================================

/**
 * I/O 操作异常基类
 *
 * 这是所有 I/O 相关异常的基类，对应 Java 的 java.io.IOException。
 * 支持异常链（suppressed exceptions）用于记录多个相关异常。
 *
 * @example
 * ```typescript
 * try {
 *   await connection.connect()
 * } catch (e) {
 *   if (e instanceof IOException) {
 *     console.log('I/O error:', e.message)
 *   }
 * }
 * ```
 */
export class IOException extends Error {
  /** 被压制的异常列表，用于记录异常链 */
  suppressed: IOException[]

  constructor(message: string) {
    super(message)
    this.name = 'IOException'
    this.suppressed = []
  }

  /**
   * 从列表中添加多个被压制的异常
   * @param suppressed 异常列表
   * @returns 返回自身，支持链式调用
   */
  withSuppressed(suppressed: List<IOException>): this {
    for (const e of suppressed) {
      this.addSuppressed(e)
    }
    return this
  }

  /**
   * 添加一个被压制的异常
   * @param e 要添加的异常
   */
  addSuppressed(e: IOException): void {
    this.suppressed.push(e)
  }
}

// ============================================================================
// 第二部分：Socket 相关异常
// ============================================================================

/**
 * Socket 操作异常
 *
 * 当 Socket 操作失败时抛出，如连接被拒绝、连接重置等。
 * 对应 Java 的 java.net.SocketException。
 */
export class SocketException extends IOException {
  constructor(message: string) {
    super(message)
    this.name = 'SocketException'
  }
}

/**
 * Socket 超时异常
 *
 * 当 Socket 操作超时时抛出，包括连接超时、读取超时、写入超时。
 * 对应 Java 的 java.net.SocketTimeoutException。
 *
 * @example
 * ```typescript
 * throw new SocketTimeoutException('Connect timed out after 10000ms')
 * ```
 */
export class SocketTimeoutException extends SocketException {
  constructor(message: string) {
    super(message)
    this.name = 'SocketTimeoutException'
  }
}

/**
 * DNS 解析失败异常
 *
 * 当无法解析主机名时抛出。
 * 对应 Java 的 java.net.UnknownHostException。
 *
 * @example
 * ```typescript
 * throw new UnknownHostException('Unable to resolve host: example.invalid')
 * ```
 */
export class UnknownHostException extends IOException {
  constructor(message: string) {
    super(message)
    this.name = 'UnknownHostException'
  }
}

// ============================================================================
// 第三部分：HTTP 协议异常
// ============================================================================

/**
 * HTTP 协议异常
 *
 * 当遇到 HTTP 协议违规时抛出，如无效的状态行、无效的头部等。
 * 对应 Java 的 java.net.ProtocolException。
 *
 * @example
 * ```typescript
 * throw new ProtocolException('Unexpected status line: INVALID')
 * ```
 */
export class ProtocolException extends IOException {
  constructor(message: string) {
    super(message)
    this.name = 'ProtocolException'
  }
}

/**
 * I/O 操作被中断异常
 *
 * 当 I/O 操作被中断时抛出，通常用于超时处理。
 * 对应 Java 的 java.io.InterruptedIOException。
 */
export class InterruptedIOException extends IOException {
  /** 原始异常原因（类似 Java 的 cause） */
  private _cause?: Error

  constructor(message: string) {
    super(message)
    this.name = 'InterruptedIOException'
  }

  /**
   * 初始化异常原因（类似 Java 的 Throwable.initCause）
   * @param cause 原始异常
   */
  initCause(cause: Error): void {
    this._cause = cause
    // 更新 message 以包含原始异常信息
    if (cause) {
      this.message = `${this.message}: ${cause.name}: ${cause.message}`
    }
  }

  /**
   * 获取原始异常原因
   */
  get cause(): Error | undefined {
    return this._cause
  }
}

// ============================================================================
// 第四部分：SSL/TLS 相关异常
// ============================================================================

/**
 * SSL/TLS 异常基类
 *
 * 所有 SSL/TLS 相关异常的基类。
 * 对应 Java 的 javax.net.ssl.SSLException。
 */
export class SSLException extends IOException {
  constructor(message?: string) {
    super(message ?? 'SSL error')
    this.name = 'SSLException'
  }
}

/**
 * SSL 握手失败异常
 *
 * 当 SSL/TLS 握手过程失败时抛出，如协议版本不兼容、密码套件不匹配等。
 * 对应 Java 的 javax.net.ssl.SSLHandshakeException。
 *
 * @example
 * ```typescript
 * throw new SSLHandshakeException('Handshake failed: no common cipher suites')
 * ```
 */
export class SSLHandshakeException extends SSLException {
  /** 导致握手失败的原因 */
  readonly cause?: Error

  constructor(message: string, cause?: Error) {
    super(message)
    this.name = 'SSLHandshakeException'
    this.cause = cause
  }
}

/**
 * SSL 对端验证失败异常
 *
 * 当无法验证 SSL 连接的对端身份时抛出，通常是证书主机名不匹配。
 * 对应 Java 的 javax.net.ssl.SSLPeerUnverifiedException。
 *
 * @example
 * ```typescript
 * throw new SSLPeerUnverifiedException('Hostname example.com not verified')
 * ```
 */
export class SSLPeerUnverifiedException extends SSLException {
  constructor(message: string) {
    super(message)
    this.name = 'SSLPeerUnverifiedException'
  }
}

// ============================================================================
// 第五部分：证书相关异常
// ============================================================================

/**
 * 证书异常基类
 *
 * 所有证书验证相关异常的基类。
 * 对应 Java 的 java.security.cert.CertificateException。
 */
export class CertificateException extends IOException {
  constructor(message: string) {
    super(message)
    this.name = 'CertificateException'
  }
}

/**
 * 证书过期异常
 *
 * 当证书已过期或尚未生效时抛出。
 */
export class CertificateExpiredException extends CertificateException {
  /** 证书有效期开始时间 */
  readonly notBefore?: Date
  /** 证书有效期结束时间 */
  readonly notAfter?: Date

  constructor(message: string, notBefore?: Date, notAfter?: Date) {
    super(message)
    this.name = 'CertificateExpiredException'
    this.notBefore = notBefore
    this.notAfter = notAfter
  }
}

/**
 * 证书尚未生效异常
 *
 * 当证书的有效期开始时间在当前时间之后时抛出。
 */
export class CertificateNotYetValidException extends CertificateException {
  /** 证书有效期开始时间 */
  readonly notBefore?: Date

  constructor(message: string, notBefore?: Date) {
    super(message)
    this.name = 'CertificateNotYetValidException'
    this.notBefore = notBefore
  }
}

/**
 * 证书被吊销异常
 *
 * 当证书已被证书颁发机构吊销时抛出。
 */
export class CertificateRevokedException extends CertificateException {
  /** 吊销日期 */
  readonly revocationDate?: Date
  /** 吊销原因 */
  readonly reason?: string

  constructor(message: string, revocationDate?: Date, reason?: string) {
    super(message)
    this.name = 'CertificateRevokedException'
    this.revocationDate = revocationDate
    this.reason = reason
  }
}

/**
 * 证书链验证异常
 *
 * 当证书链验证失败时抛出，如中间证书缺失、根证书不受信任等。
 */
export class CertificatePathException extends CertificateException {
  /** 验证失败的证书在链中的索引位置 */
  readonly index?: number

  constructor(message: string, index?: number) {
    super(message)
    this.name = 'CertificatePathException'
    this.index = index
  }
}

// ============================================================================
// 第六部分：连接相关异常
// ============================================================================

/**
 * 连接关闭异常
 *
 * 当尝试在已关闭的连接上进行操作时抛出。
 * 对应 OkHttp 的 okhttp3.internal.http2.ConnectionShutdownException。
 */
export class ConnectionShutdownException extends IOException {
  constructor(message: string = 'Connection shutdown') {
    super(message)
    this.name = 'ConnectionShutdownException'
  }
}

/**
 * 代理连接异常
 *
 * 当通过代理服务器建立连接失败时抛出。
 *
 * @example
 * ```typescript
 * throw new ProxyConnectException('Proxy refused connection', 'proxy.example.com', 8080)
 * ```
 */
export class ProxyConnectException extends IOException {
  /** 代理服务器地址 */
  readonly proxyAddress?: string
  /** 代理服务器端口 */
  readonly proxyPort?: number

  constructor(message: string, proxyAddress?: string, proxyPort?: number) {
    super(message)
    this.name = 'ProxyConnectException'
    this.proxyAddress = proxyAddress
    this.proxyPort = proxyPort
  }
}

/**
 * SNI (Server Name Indication) 异常
 *
 * 当 TLS SNI 扩展处理失败时抛出。
 */
export class SNIException extends IOException {
  /** 请求的服务器名称 */
  readonly serverName?: string

  constructor(message: string, serverName?: string) {
    super(message)
    this.name = 'SNIException'
    this.serverName = serverName
  }
}

/**
 * 路由异常
 *
 * 当连接尝试所有可用路由后仍然失败时抛出。
 * 封装了第一个和最后一个连接异常，以及所有中间异常（作为 suppressed）。
 * 对应 OkHttp 的 okhttp3.internal.connection.RouteException。
 *
 * @example
 * ```typescript
 * const routeException = new RouteException(firstException)
 * routeException.addConnectException(secondException)
 * throw routeException
 * ```
 */
export class RouteException extends Error {
  /** 第一次连接尝试的异常 */
  private readonly _firstConnectException: IOException
  /** 最后一次连接尝试的异常 */
  private _lastConnectException: IOException

  constructor(firstConnectException: IOException) {
    super(firstConnectException?.message || 'Connection failed')
    this.name = 'RouteException'
    this._firstConnectException = firstConnectException
    this._lastConnectException = firstConnectException

    // 初始化 suppressed 异常列表
    if (!this._firstConnectException.suppressed) {
      this._firstConnectException.suppressed = []
    }
  }

  /** 获取第一次连接尝试的异常 */
  get firstConnectException(): IOException {
    return this._firstConnectException
  }

  /** 获取最后一次连接尝试的异常 */
  get lastConnectException(): IOException {
    return this._lastConnectException
  }

  /**
   * 添加新的连接异常
   *
   * 将新异常添加到 firstConnectException 的 suppressed 列表中，
   * 并更新 lastConnectException。
   *
   * @param e 连接异常
   */
  addConnectException(e: IOException): void {
    this._firstConnectException.suppressed.push(e)
    this._lastConnectException = e
  }
}

// ============================================================================
// 第七部分：HTTP/2 相关异常
// ============================================================================

/**
 * HTTP/2 流重置异常
 *
 * 当 HTTP/2 流被对端重置时抛出，包含重置的错误码。
 * 对应 OkHttp 的 okhttp3.internal.http2.StreamResetException。
 *
 * @example
 * ```typescript
 * throw new StreamResetException('Stream reset', ErrorCode.CANCEL)
 * ```
 */
export class StreamResetException extends Error {
  /** HTTP/2 错误码 */
  readonly errorCode: ErrorCode

  constructor(message: string, errorCode: ErrorCode) {
    super(message)
    this.name = 'StreamResetException'
    this.errorCode = errorCode
  }
}

// ============================================================================
// 第八部分：其他异常
// ============================================================================

/**
 * 文件未找到异常
 *
 * 当尝试访问不存在的文件时抛出。
 * 对应 Java 的 java.io.FileNotFoundException。
 */
export class FileNotFoundException extends IOException {
  constructor(message: string) {
    super(message)
    this.name = 'FileNotFoundException'
  }
}

/**
 * 未知服务异常
 *
 * 当请求的服务类型未知或不支持时抛出。
 * 对应 Java 的 java.net.UnknownServiceException。
 *
 * @example
 * ```typescript
 * throw new UnknownServiceException('CLEARTEXT communication not enabled for client')
 * ```
 */
export class UnknownServiceException extends IOException {
  constructor(message: string) {
    super(message)
    this.name = 'UnknownServiceException'
  }
}

/**
 * 运行时异常基类
 *
 * 表示程序运行时发生的异常，通常是由于程序逻辑错误导致的。
 * 对应 Java 的 java.lang.RuntimeException。
 */
export class RuntimeException extends Error {
  constructor(message: string) {
    super(message)
    this.name = 'RuntimeException'
  }
}

/**
 * 非法状态异常
 *
 * 当在不正确的状态下调用方法时抛出。
 * 对应 Java 的 java.lang.IllegalStateException。
 *
 * @example
 * ```typescript
 * if (this.executed) {
 *   throw new IllegalStateException('Already executed')
 * }
 * ```
 */
export class IllegalStateException extends RuntimeException {
  constructor(message: string) {
    super(message)
    this.name = 'IllegalStateException'
  }
}

/**
 * 非法参数异常
 *
 * 当传入方法的参数不合法时抛出。
 * 对应 Java 的 java.lang.IllegalArgumentException。
 *
 * @example
 * ```typescript
 * if (timeout < 0) {
 *   throw new IllegalArgumentException('timeout must be >= 0')
 * }
 * ```
 */
export class IllegalArgumentException extends RuntimeException {
  constructor(message: string) {
    super(message)
    this.name = 'IllegalArgumentException'
  }
}

/**
 * 索引越界异常
 *
 * 当数组或列表的索引超出有效范围时抛出。
 * 对应 Java 的 java.lang.IndexOutOfBoundsException。
 *
 * @example
 * ```typescript
 * if (index < 0 || index >= array.length) {
 *   throw new IndexOutOfBoundsException(`Index ${index} out of bounds for length ${array.length}`)
 * }
 * ```
 */
export class IndexOutOfBoundsException extends RuntimeException {
  constructor(message: string) {
    super(message)
    this.name = 'IndexOutOfBoundsException'
  }
}

/**
 * 数组索引越界异常
 *
 * 当数组的索引超出有效范围时抛出。
 * 对应 Java 的 java.lang.ArrayIndexOutOfBoundsException。
 *
 * @example
 * ```typescript
 * if (index < 0 || index >= array.length) {
 *   throw new ArrayIndexOutOfBoundsException(index)
 * }
 * ```
 */
export class ArrayIndexOutOfBoundsException extends IndexOutOfBoundsException {
  /** 越界的索引值 */
  readonly index?: number

  constructor(message: string | number) {
    if (typeof message === 'number') {
      super(`Array index out of range: ${message}`)
      this.index = message
    } else {
      super(message)
    }
    this.name = 'ArrayIndexOutOfBoundsException'
  }
}

/**
 * 元素不存在异常
 *
 * 当请求的元素不存在时抛出。
 * 对应 Java 的 java.util.NoSuchElementException。
 */
export class NoSuchElementException extends RuntimeException {
  constructor(message: string) {
    super(message)
    this.name = 'NoSuchElementException'
  }
}

/**
 * 断言错误
 *
 * 当断言失败时抛出，表示程序逻辑存在错误。
 * 对应 Java 的 java.lang.AssertionError。
 *
 * @example
 * ```typescript
 * if (value === null) {
 *   throw new AssertionError('value should never be null')
 * }
 * ```
 */
export class AssertionError extends Error {
  constructor(message: string) {
    super(message)
    this.name = 'AssertionError'
  }
}

// ============================================================================
// 第九部分：已废弃的异常（保留用于向后兼容）
// ============================================================================

/**
 * SSL 证书验证异常
 *
 * @deprecated 建议使用更具体的 CertificateException 子类
 */
export class SSLCertificateException extends IOException {
  readonly errorCode?: number
  readonly cause?: Error

  constructor(message: string, errorCode?: number, cause?: Error) {
    super(message)
    this.name = 'SSLCertificateException'
    this.errorCode = errorCode
    this.cause = cause
  }
}



/**
 * A connection to a remote web server capable of carrying 1 or more concurrent streams.
 *
 * A connection's lifecycle has two phases.
 *
 *  1. While it's connecting, the connection is owned by a single call using single thread. In this
 *     phase the connection is not shared and no locking is necessary.
 *
 *  2. Once connected, a connection is shared to a connection pool. In this phase accesses to the
 *     connection's state must be guarded by holding a lock on the connection.
 */

/**
 * Socket 错误信息接口
 * 对应 HarmonyOS socket on('error') 回调的错误对象
 */
interface SocketErrorInfo {
  /** 错误码 */
  errorNumber?: number
  /** 错误描述 */
  errorString?: string
}

/**
 * HarmonyOS Socket 错误码常量
 *
 * 错误码映射关系：
 * - TCP/UDP Socket: 2301000 + Linux 内核错误码
 * - Socket Server: 2303100 + Linux 内核错误码
 *
 * 参考文档：https://developer.huawei.com/consumer/cn/doc/harmonyos-references/errorcode-net-socket
 */
export const SocketErrorCode = {
  // ==================== 通用错误 ====================
  /** 操作不允许 - Operation not permitted */
  EPERM: 2301001,
  /** 文件不存在 - No such file or directory */
  ENOENT: 2301002,
  /** 进程不存在 - No such process */
  ESRCH: 2301003,
  /** 系统调用中断 - Interrupted system call */
  EINTR: 2301004,
  /** 系统内部错误 - System internal error (内存异常/空指针) */
  SYSTEM_INTERNAL_ERROR: 2300002,

  // ==================== SOCKS5 代理错误 ====================
  /** SOCKS5 连接代理服务器失败 */
  SOCKS5_PROXY_CONNECT_FAILED: 2301206,
  /** SOCKS5 认证用户名或密码无效 */
  SOCKS5_AUTH_INVALID: 2301207,
  /** SOCKS5 连接远程服务器失败 */
  SOCKS5_REMOTE_CONNECT_FAILED: 2301208,
  /** SOCKS5 协商认证方式失败 */
  SOCKS5_AUTH_NEGOTIATION_FAILED: 2301209,
  /** SOCKS5 发送消息失败 */
  SOCKS5_SEND_FAILED: 2301210,
  /** SOCKS5 接收消息失败 */
  SOCKS5_RECV_FAILED: 2301211,
  /** SOCKS5 消息序列化失败 */
  SOCKS5_SERIALIZE_ERROR: 2301212,
  /** SOCKS5 消息反序列化失败 */
  SOCKS5_DESERIALIZE_ERROR: 2301213,

  // ==================== Socket Server 错误 ====================
  /** 中断系统调用 - Interrupted system call (connect 阻塞过长) */
  SERVER_EINTR: 2303104,
  /** 错误文件编号 - Bad file number (socket 已关闭) */
  SERVER_EBADF: 2303109,
  /** 资源暂时不可用 - Resource temporarily unavailable */
  SERVER_EAGAIN: 2303111,
  /** 非套接字的套接字操作 - Not a socket */
  SERVER_ENOTSOCK: 2303188,
  /** Socket 协议类型错误 - Incorrect socket protocol type */
  SERVER_EPROTOTYPE: 2303191,
  /** 网络地址已被使用 - Address already in use */
  SERVER_EADDRINUSE: 2303198,
  /** 不能分配请求的地址 - Address not available */
  SERVER_EADDRNOTAVAIL: 2303199,
  /** 网络已关闭 - Network is down */
  SERVER_ENETDOWN: 2303200,
  /** 连接超时 - Connection timed out */
  SERVER_ETIMEDOUT: 2303210,

  // ==================== TLS/SSL 错误 ====================
  /** SSL 为空 - SSL is null */
  SSL_NULL: 2303501,
  /** TLS 读取错误 - 等待套接字可读 (底层 socket 阻塞) */
  SSL_ERROR_WANT_READ: 2303502,
  /** TLS 写入错误 - 等待套接字可写 (发送端缓冲区已满) */
  SSL_ERROR_WANT_WRITE: 2303503,
  /** 验证 x509 证书错误 */
  SSL_X509_VERIFY_ERROR: 2303504,
  /** TLS 系统调用错误 - 不可恢复的致命 I/O 错误 */
  SSL_ERROR_SYSCALL: 2303505,
  /** 清除 TLS 连接出错 - TLS/SSL 连接已关闭 */
  SSL_CONNECTION_CLOSED: 2303506,

  // ==================== 常见 Linux 内核错误码 (2301000 + errno) ====================
  /** 连接被拒绝 - ECONNREFUSED (errno=111) */
  ECONNREFUSED: 2301111,
  /** 连接被重置 - ECONNRESET (errno=104) */
  ECONNRESET: 2301104,
  /** 主机不可达 - EHOSTUNREACH (errno=113) */
  EHOSTUNREACH: 2301113,
  /** 网络不可达 - ENETUNREACH (errno=101) */
  ENETUNREACH: 2301101,
  /** 连接超时 - ETIMEDOUT (errno=110) */
  ETIMEDOUT: 2301110,
  /** 连接中止 - ECONNABORTED (errno=103) */
  ECONNABORTED: 2301103,
  /** 管道破裂 - EPIPE (errno=32) */
  EPIPE: 2301032,
  /** 网络已关闭 - ENETDOWN (errno=100) */
  ENETDOWN: 2301100,
  /** 地址已使用 - EADDRINUSE (errno=98) */
  EADDRINUSE: 2301098,
  /** 地址不可用 - EADDRNOTAVAIL (errno=99) */
  EADDRNOTAVAIL: 2301099,
} as const

/**
 * 根据 HarmonyOS socket 错误码创建对应的异常类型
 *
 * @param err Socket 错误信息
 * @param socketType Socket 类型（用于日志区分）
 * @returns 对应的异常实例
 */
export function createSocketException(err: BusinessError, socketType: 'TCP' | 'TLS' = 'TCP'): IOException {
  const errorNumber = err?.code ?? 0
  const errorString = err?.code ?? 'Unknown socket error'
  const fullMessage = `[${socketType}] Socket error ${errorNumber}: ${errorString}`

  // ==================== 超时相关错误 ====================
  if (errorNumber === SocketErrorCode.ETIMEDOUT ||
    errorNumber === SocketErrorCode.SERVER_ETIMEDOUT) {
    return new SocketTimeoutException(`Connection timed out: ${errorString}`)
  }

  // ==================== TLS/SSL 相关错误 ====================
  if (socketType === 'TLS') {
    switch (errorNumber) {
      case SocketErrorCode.SSL_ERROR_WANT_READ:
      case SocketErrorCode.SSL_ERROR_WANT_WRITE:
        // 这些是非阻塞 I/O 的正常状态，通常不应该抛出异常
        return new SSLException(`SSL I/O pending: ${errorString}`)
      case SocketErrorCode.SSL_NULL:
        return new SSLException(`SSL context is null: ${errorString}`)
      case SocketErrorCode.SSL_ERROR_SYSCALL:
        return new SSLException(`SSL fatal I/O error: ${errorString}`)
      case SocketErrorCode.SSL_X509_VERIFY_ERROR:
        return new SSLHandshakeException(`Certificate verification failed: ${errorString}`)
      case SocketErrorCode.SSL_CONNECTION_CLOSED:
        return new ConnectionShutdownException(`TLS connection closed: ${errorString}`)
    }
  }

  // ==================== SOCKS5 代理错误 ====================
  switch (errorNumber) {
    case SocketErrorCode.SOCKS5_PROXY_CONNECT_FAILED:
      return new SocketException(`SOCKS5 proxy connection failed: ${errorString}`)
    case SocketErrorCode.SOCKS5_AUTH_INVALID:
      return new SocketException(`SOCKS5 authentication failed - invalid username or password: ${errorString}`)
    case SocketErrorCode.SOCKS5_REMOTE_CONNECT_FAILED:
      return new SocketException(`SOCKS5 failed to connect to remote server: ${errorString}`)
    case SocketErrorCode.SOCKS5_AUTH_NEGOTIATION_FAILED:
      return new SocketException(`SOCKS5 authentication negotiation failed: ${errorString}`)
    case SocketErrorCode.SOCKS5_SEND_FAILED:
      return new SocketException(`SOCKS5 send message failed: ${errorString}`)
    case SocketErrorCode.SOCKS5_RECV_FAILED:
      return new SocketException(`SOCKS5 receive message failed: ${errorString}`)
    case SocketErrorCode.SOCKS5_SERIALIZE_ERROR:
      return new SocketException(`SOCKS5 message serialization error: ${errorString}`)
    case SocketErrorCode.SOCKS5_DESERIALIZE_ERROR:
      return new SocketException(`SOCKS5 message deserialization error: ${errorString}`)
  }

  // ==================== 连接关闭/中止相关错误 ====================
  switch (errorNumber) {
    case SocketErrorCode.ECONNABORTED:
    case SocketErrorCode.SERVER_EINTR:
      return new ConnectionShutdownException(`Connection aborted: ${errorString}`)
    case SocketErrorCode.SERVER_EBADF:
      return new ConnectionShutdownException(`Socket already closed (bad file descriptor): ${errorString}`)
    case SocketErrorCode.ECONNRESET:
      return new ConnectionShutdownException(`Connection reset by peer: ${errorString}`)
    case SocketErrorCode.EPIPE:
      return new ConnectionShutdownException(`Broken pipe - connection closed: ${errorString}`)
  }

  // ==================== 连接被拒绝/不可达错误 ====================
  switch (errorNumber) {
    case SocketErrorCode.ECONNREFUSED:
      return new SocketException(`Connection refused: ${errorString}`)
    case SocketErrorCode.EHOSTUNREACH:
      return new SocketException(`Host unreachable: ${errorString}`)
    case SocketErrorCode.ENETUNREACH:
    case SocketErrorCode.SERVER_ENETDOWN:
    case SocketErrorCode.ENETDOWN:
      return new SocketException(`Network unreachable or down: ${errorString}`)
  }

  // ==================== 地址相关错误 ====================
  switch (errorNumber) {
    case SocketErrorCode.EADDRINUSE:
    case SocketErrorCode.SERVER_EADDRINUSE:
      return new SocketException(`Address already in use: ${errorString}`)
    case SocketErrorCode.EADDRNOTAVAIL:
    case SocketErrorCode.SERVER_EADDRNOTAVAIL:
      return new SocketException(`Address not available: ${errorString}`)
  }

  // ==================== 系统/资源错误 ====================
  switch (errorNumber) {
    case SocketErrorCode.SYSTEM_INTERNAL_ERROR:
      return new SocketException(`System internal error (memory or null pointer): ${errorString}`)
    case SocketErrorCode.EPERM:
      return new SocketException(`Operation not permitted: ${errorString}`)
    case SocketErrorCode.ENOENT:
      return new SocketException(`File or resource not found: ${errorString}`)
    case SocketErrorCode.ESRCH:
      return new SocketException(`Process not found: ${errorString}`)
    case SocketErrorCode.EINTR:
      return new SocketException(`System call interrupted: ${errorString}`)
    case SocketErrorCode.SERVER_EAGAIN:
      return new SocketException(`Resource temporarily unavailable, try again: ${errorString}`)
    case SocketErrorCode.SERVER_ENOTSOCK:
      return new SocketException(`Not a socket: ${errorString}`)
    case SocketErrorCode.SERVER_EPROTOTYPE:
      return new SocketException(`Incorrect socket protocol type: ${errorString}`)
  }

  // ==================== 默认处理 ====================
  return new SocketException(fullMessage)
}
